﻿using System;
using System.Collections.Generic;
using System.Text;
using MySql.Data.MySqlClient;
using equinoxWeb.Models;
using equinoxWeb.SearchObjects;
using equinoxWeb.Controllers;

namespace equinoxWeb.GestionConexion
{
    class ClienteFunction
    {
        public static int getNextId()
        {
            int idCliente = 0;
            Cliente cliente = new Cliente();
            GestorConexion gestor = new GestorConexion();
            gestor.OpenConnection();
            MySqlConnection con = gestor.Connection;
            MySqlCommand cmd;
            cmd = new MySqlCommand("select count(*)  from cliente", con);
            cmd.Prepare();
            MySqlDataReader res = cmd.ExecuteReader();
            while (res.Read())
            {
                idCliente = res.GetInt32(0);
            }
            idCliente++;
            res.Close();
            gestor.CloseConnection();
            return idCliente;
        }
        public static int getNextId(MySqlConnection con)
        {
            int idCliente = 0;
            MySqlCommand cmd;
            cmd = new MySqlCommand("select count(*)  from cliente", con);
            cmd.Prepare();
            MySqlDataReader res = cmd.ExecuteReader();
            while (res.Read())
            {
                idCliente = res.GetInt32(0);
            }
            idCliente++;
            res.Close();
            return idCliente;
        }
        public static Cliente abrirCliente(int id)
        {
            Cliente cliente = new Cliente();
            GestorConexion gestor = new GestorConexion();
            gestor.OpenConnection();
            MySqlConnection con = gestor.Connection;
            MySqlCommand cmd;
            cmd = new MySqlCommand("SELECT idcliente,codigoCliente, " +
                "nombreReferencia,nombreContacto,correoCorp,correoContacto, " +
                "telefonoCorp,telefonoContacto,razonSocial,ruc,direccion " +
                "FROM cliente WHERE idcliente=@id", con);
            cmd.Parameters.AddWithValue("@id", id);
            cmd.Prepare();
            MySqlDataReader res = cmd.ExecuteReader();

            if (res.Read())
            {
                cliente.Idcliente = res.GetInt32("idcliente");
                cliente.CodigoCliente = !res.IsDBNull(1) ? res.GetString("codigoCliente") : "";
                cliente.NombreReferencia = !res.IsDBNull(2) ? res.GetString("nombreReferencia") : "";
                cliente.NombreContacto = !res.IsDBNull(3) ? res.GetString("nombreContacto") : "";
                cliente.CorreoCorp = !res.IsDBNull(4) ? res.GetString("correoCorp") : "";
                cliente.CorreoContacto = !res.IsDBNull(5) ? res.GetString("correoContacto") : "";
                cliente.TelefonoCorp = !res.IsDBNull(6) ? res.GetString("telefonoCorp") : "";
                cliente.TelefonoContacto = !res.IsDBNull(7) ? res.GetString("telefonoContacto") : "";
                cliente.RazonSocial = !res.IsDBNull(8) ? res.GetString("razonSocial") : "";
                cliente.Ruc = !res.IsDBNull(9) ? res.GetString("ruc") : "";
                cliente.Direccion = !res.IsDBNull(10) ? res.GetString("direccion") : "";
                //cliente.Tieneclub = res.GetInt32("tieneclub");
            }
            else
                cliente = null;
            res.Close();
            gestor.CloseConnection();
            return cliente;
        }
        public static List<Cliente> listarCliente()
        {
            List<Cliente> listaCliente = new List<Cliente>();
            GestorConexion gestor = new GestorConexion();
            gestor.OpenConnection();
            MySqlConnection con = gestor.Connection;
            MySqlCommand cmd;
            cmd = new MySqlCommand("SELECT idcliente,codigoCliente, " +
                "nombreReferencia,nombreContacto,correoCorp,correoContacto, " +
                "telefonoCorp,telefonoContacto,razonSocial,ruc,direccion " +
                "FROM cliente ", con);
            cmd.Prepare();
            MySqlDataReader res = cmd.ExecuteReader();

            while (res.Read())
            {
                Cliente cliente = new Cliente();
                cliente.Idcliente = res.GetInt32("idcliente");
                cliente.CodigoCliente = !res.IsDBNull(1) ? res.GetString("codigoCliente") : "";
                cliente.NombreReferencia = !res.IsDBNull(2) ? res.GetString("nombreReferencia") : "";
                cliente.NombreContacto = !res.IsDBNull(3) ? res.GetString("nombreContacto") : "";
                cliente.CorreoCorp = !res.IsDBNull(4) ? res.GetString("correoCorp") : "";
                cliente.CorreoContacto = !res.IsDBNull(5) ? res.GetString("correoContacto") : "";
                cliente.TelefonoCorp = !res.IsDBNull(6) ? res.GetString("telefonoCorp") : "";
                cliente.TelefonoContacto = !res.IsDBNull(7) ? res.GetString("telefonoContacto") : "";
                cliente.RazonSocial = !res.IsDBNull(8) ? res.GetString("razonSocial") : "";
                cliente.Ruc = !res.IsDBNull(9) ? res.GetString("ruc") : "";
                cliente.Direccion = !res.IsDBNull(10) ? res.GetString("direccion") : "";
                //cliente.Tieneclub = res.GetInt32("tieneclub");
                listaCliente.Add(cliente);
            }
            res.Close();
            gestor.CloseConnection();
            return listaCliente;
        }
        public static void agregarCliente(Cliente clienteModel,EquinoxController controller)
        {
            GestorConexion gestor = new GestorConexion();
            gestor.OpenConnection();
            MySqlConnection con = gestor.Connection;
            clienteModel.Idcliente = getNextId(con);
            MySqlCommand cmd;
            cmd = new MySqlCommand("Insert into cliente (idcliente,codigoCliente, " +
                "nombreReferencia,nombreContacto,correoCorp,correoContacto, " +
                "telefonoCorp,telefonoContacto,razonSocial,ruc,direccion) " +
                "values (@idCliente,@codigoCliente, " +
                "@nombreReferencia,@nombreContacto,@correoCorp,@correoContacto, " +
                "@telefonoCorp,@telefonoContacto,@razonSocial,@ruc,@direccion)", con);
            cmd.Parameters.AddWithValue("@idCliente", clienteModel.Idcliente);
            cmd.Parameters.AddWithValue("@codigoCliente", clienteModel.CodigoCliente);
            cmd.Parameters.AddWithValue("@nombreReferencia", clienteModel.RazonSocial);
            cmd.Parameters.AddWithValue("@nombreContacto", clienteModel.NombreContacto);
            cmd.Parameters.AddWithValue("@correoCorp", clienteModel.CorreoCorp);
            cmd.Parameters.AddWithValue("@correoContacto", clienteModel.CorreoContacto);
            cmd.Parameters.AddWithValue("@telefonoCorp", clienteModel.TelefonoCorp);
            cmd.Parameters.AddWithValue("@telefonoContacto", clienteModel.TelefonoContacto);
            cmd.Parameters.AddWithValue("@razonSocial", clienteModel.RazonSocial);
            cmd.Parameters.AddWithValue("@ruc", clienteModel.Ruc);
            cmd.Parameters.AddWithValue("@direccion", clienteModel.Direccion);
            //cmd.Parameters.AddWithValue("@tieneclub", clienteModel.Tieneclub);
            cmd.Prepare();
            cmd.ExecuteNonQuery();
            Usuario usuarioModel = new Usuario();
            usuarioModel.Nombre = clienteModel.RazonSocial;
            usuarioModel.IdCliente = clienteModel.Idcliente;

            UsuarioFunction.agregarUsuario(usuarioModel);
            bool  existe = !CuentaController.registrarCliente(clienteModel.Idcliente, clienteModel.NombreReferencia,con);
            if (existe)
                controller.mensajeError = "Cuenta ya existente";
            else
                controller.mensajeError = "";
            gestor.CloseConnection();
        }
        public static void modificarCliente(Cliente clienteModel)
        {
            GestorConexion gestor = new GestorConexion();
            gestor.OpenConnection();
            MySqlConnection con = gestor.Connection;
            MySqlCommand cmd;
            cmd = new MySqlCommand("update cliente set codigoCliente = @codigoCliente, nombreReferencia = @nombreReferencia, " +
                "nombreContacto = @nombreContacto, correoCorp = @correoCorp,correoContacto = @correoContacto, telefonoCorp = @telefonoCorp, " +
                "telefonoContacto = @telefonoContacto,razonSocial = @razonSocial,ruc = @ruc,direccion = @direccion where idcliente = @idcliente ", con);
            cmd.Parameters.AddWithValue("@idcliente", clienteModel.Idcliente);
            cmd.Parameters.AddWithValue("@codigoCliente", clienteModel.CodigoCliente);
            cmd.Parameters.AddWithValue("@nombreReferencia", clienteModel.RazonSocial);
            cmd.Parameters.AddWithValue("@nombreContacto", clienteModel.NombreContacto);
            cmd.Parameters.AddWithValue("@correoCorp", clienteModel.CorreoCorp);
            cmd.Parameters.AddWithValue("@correoContacto", clienteModel.CorreoContacto);
            cmd.Parameters.AddWithValue("@telefonoCorp", clienteModel.TelefonoCorp);
            cmd.Parameters.AddWithValue("@telefonoContacto", clienteModel.TelefonoContacto);
            cmd.Parameters.AddWithValue("@razonSocial", clienteModel.RazonSocial);
            cmd.Parameters.AddWithValue("@ruc", clienteModel.Ruc);
            cmd.Parameters.AddWithValue("@direccion", clienteModel.Direccion);
            //cmd.Parameters.AddWithValue("@tieneclub", clienteModel.Tieneclub);
            cmd.Prepare();
            cmd.ExecuteNonQuery();
            gestor.CloseConnection();
        }
        
        public static List<Cliente> buscarCliente(ClienteBusqueda clienteModel)
        {
            List<Cliente> clientes = new List<Cliente>();
            GestorConexion gestor = new GestorConexion();
            gestor.OpenConnection();
            MySqlConnection con = gestor.Connection;
            MySqlCommand cmd;
            cmd = new MySqlCommand("SELECT idcliente,codigoCliente, " +
                " nombreReferencia,nombreContacto,correoCorp,correoContacto, " +
                " telefonoCorp,telefonoContacto,razonSocial,ruc,direccion " +
                " FROM cliente " +
                (hayParametros(clienteModel) ? "WHERE 1=1 " : "") +
                (clienteModel.CodigoCliente != null && clienteModel.CodigoCliente.Length != 0 ? " and codigoCliente like '%'  @codigoCliente '%'  " : "") +
                (clienteModel.NombreReferencia != null && clienteModel.NombreReferencia.Length != 0 ? " and nombreReferencia like '%'  @nombreReferencia '%'  " : "") +
                (clienteModel.NombreContacto != null && clienteModel.NombreContacto.Length != 0 ? " and nombreContacto like '%'  @nombreContacto '%'  " : "") +
                (clienteModel.RazonSocial != null && clienteModel.RazonSocial.Length != 0 ? " and razonSocial like '%'  @razonSocial '%'  " : "") +
                (clienteModel.Ruc != null && clienteModel.Ruc.Length != 0 ? " and ruc like '%'  @ruc  '%' " : ""), con);
            if (clienteModel.CodigoCliente != null && clienteModel.CodigoCliente.Length != 0)
                cmd.Parameters.AddWithValue("@codigoCliente", clienteModel.CodigoCliente);

            if (clienteModel.NombreReferencia != null && clienteModel.NombreReferencia.Length != 0)
                cmd.Parameters.AddWithValue("@nombreReferencia", clienteModel.NombreReferencia);

            if (clienteModel.NombreContacto != null && clienteModel.NombreContacto.Length != 0)
                cmd.Parameters.AddWithValue("@nombreContacto", clienteModel.NombreContacto);

            if (clienteModel.RazonSocial != null && clienteModel.RazonSocial.Length != 0)
                cmd.Parameters.AddWithValue("@razonSocial", clienteModel.RazonSocial);

            if (clienteModel.Ruc != null && clienteModel.Ruc.Length != 0)
                cmd.Parameters.AddWithValue("@ruc", clienteModel.Ruc);
            cmd.Prepare();
            MySqlDataReader res = cmd.ExecuteReader();
            while (res.Read())
            {
                Cliente cliente = new Cliente();
                cliente.Idcliente = res.GetInt32("idcliente");
                cliente.CodigoCliente = !res.IsDBNull(1) ? res.GetString("codigoCliente") : "";
                cliente.NombreReferencia = !res.IsDBNull(2) ? res.GetString("nombreReferencia") : "";
                cliente.NombreContacto = !res.IsDBNull(3) ? res.GetString("nombreContacto") : "";
                cliente.CorreoCorp = !res.IsDBNull(4) ? res.GetString("correoCorp") : "";
                cliente.CorreoContacto = !res.IsDBNull(5) ? res.GetString("correoContacto") : "";
                cliente.TelefonoCorp = !res.IsDBNull(6) ? res.GetString("telefonoCorp") : "";
                cliente.TelefonoContacto = !res.IsDBNull(7) ? res.GetString("telefonoContacto") : "";
                cliente.RazonSocial = !res.IsDBNull(8) ? res.GetString("razonSocial") : "";
                cliente.Ruc = !res.IsDBNull(9) ? res.GetString("ruc") : "";
                cliente.Direccion = !res.IsDBNull(10) ? res.GetString("direccion") : "";
                //cliente.Tieneclub = res.GetInt32("tieneclub");
                clientes.Add(cliente);
                //res.NextResult();
            }
            res.Close();
            gestor.CloseConnection();
            return clientes;
        }
        private static bool hayParametros(Cliente clienteModel)
        {
            return (clienteModel.CodigoCliente != null && clienteModel.CodigoCliente.Length != 0) ||
                (clienteModel.NombreReferencia != null && clienteModel.NombreReferencia.Length != 0) ||
                (clienteModel.NombreContacto != null && clienteModel.NombreContacto.Length != 0) ||
                (clienteModel.RazonSocial != null && clienteModel.RazonSocial.Length != 0) ||
                (clienteModel.Ruc != null && clienteModel.Ruc.Length != 0);
        }
        private static bool hayParametros(ClienteBusqueda clienteModel)
        {
            return (clienteModel.CodigoCliente != null && clienteModel.CodigoCliente.Length != 0) ||
                (clienteModel.NombreReferencia != null && clienteModel.NombreReferencia.Length != 0) ||
                (clienteModel.NombreContacto != null && clienteModel.NombreContacto.Length != 0) ||
                (clienteModel.RazonSocial != null && clienteModel.RazonSocial.Length != 0) ||
                (clienteModel.Ruc != null && clienteModel.Ruc.Length != 0);
        }
    }
}
